package eteam.aps.systemservice.dal;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import eteam.aps.systeminterface.model.entity.OrgEntity;
import eteam.aps.systeminterface.model.enums.OrgTypeEnum;
import eteam.aps.systeminterface.model.enums.StateEnum;
import eteam.aps.systemservice.dal.mapper.IOrgMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 机构数据操作类
 */
@Service
public class OrgDal {
    @Autowired
    private IOrgMapper orgMapper;

    /**
     * 根据ID获取机构信息
     *
     * @param orgId
     * @return
     */
    public OrgEntity getById(String orgId) {
        return orgMapper.selectById(orgId);
    }

    /**
     * 根据机构名称获取机构信息【模糊查找】
     *
     * @param orgName
     * @return: 机构列表
     */
    public List<OrgEntity> getListByName(String orgName) {
        return orgMapper.selectList(new QueryWrapper<OrgEntity>()
                .eq("State", StateEnum.Enable.getValue())
                .and(i -> i.like("FName", orgName))
        );
    }

    /**
     * 根据机构名称获取机构信息
     *
     * @param orgName
     * @return
     */
    public OrgEntity getByName(String orgName) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("FName", orgName);
        map.put("State", StateEnum.Enable.getValue());
        return orgMapper.selectOne(new QueryWrapper<OrgEntity>().allEq(map, false));
    }

    /**
     * 获取机构数据列表
     *
     * @return: 全部机构数据
     */
    public List<OrgEntity> getOrgList() {
        return orgMapper.selectList(new QueryWrapper<OrgEntity>().eq("State", StateEnum.Enable.getValue()));
    }

    /**
     * 根据机构ID获取下级机构列表
     *
     * @param wrapper: 检索条件
     * @return: 机构数据
     */
    public List<OrgEntity> getOrgList(QueryWrapper<OrgEntity> wrapper) {
        List<OrgEntity> retList = orgMapper.selectList(wrapper);
        for (OrgEntity item : retList) {
            Integer count = orgMapper.selectCount(new QueryWrapper<OrgEntity>()
                    .eq("State", StateEnum.Enable.getValue())
                    .eq("FAboveId", item.getForgid()));
            item.setHaschildren(count > 0);
            item.setIsleaf(!item.getHaschildren());
        }
        return retList;
    }

    /**
     * 根据机构ID获取下级机构数量
     *
     * @param orgId: 机构ID
     * @return: 机构数量
     */
    public Integer getChildrenCount(String orgId) {
        if (StrUtil.isEmpty(orgId)) {
            return orgMapper.selectCount(new QueryWrapper<OrgEntity>()
                    .eq("State", StateEnum.Enable.getValue())
                    .eq("FUnitTypeId", OrgTypeEnum.Org.getValue())
                    .and(i -> i.eq("FAboveId", "").or().isNull("FAboveId")));
        } else {
            return orgMapper.selectCount(new QueryWrapper<OrgEntity>()
                    .eq("State", StateEnum.Enable.getValue())
                    .eq("FAboveId", orgId));
        }
    }

    /**
     * 新增机构数据
     *
     * @return: 受影响行数
     */
    public int insertOrg(OrgEntity entity) {
        return orgMapper.insert(entity);
    }

    /**
     * 修改机构数据
     *
     * @return: 受影响行数
     */
    public int updateOrg(OrgEntity entity) {
        return orgMapper.updateById(entity);
    }
}
